"""
    regex中的分组，在正则中对部分规则添加小括号
    1- match结果的group无参数的把匹配的**全部**取出来
    2- match.group(1) 取出匹配正则中第一个小括号的内容
    3- 先是判断是否匹配整个正则，然后取出部分内容符合小括号的内容
    4- 正则中的 | 表示or, 但是表示的是|前的”所有“or上竖线后的**所有**
    5- 三个双引号除了可以保持格式外，主要是可以有效的防止str中存在双引号和单引号
"""

import re

"""
    1- |        匹配 左右任意一个表达式
    2- (a,b)    将括号内的作为一个分组
    3- \num     引用分组num匹配到的字符串,配合小括号使用，引用第几个小括号中的正则
    4- ?P<别名>  分组起别名
    5- [^B]     ^向上的箭头在中括号里面的话，并不代表是以什么开通，而是非，相反的意思
"""
def testRegex01():

    result1 = re.match(r"(\d{3,4})-?(\d{7,8})", "0531-12345678").group(1)
    result2 = re.match(r"(\d{3,4})-?(\d{7,8})", "0531-12345678").group(2)
    print(result1)  # 0531
    print(result2)  # 12345678

    # 竖线前的所有 or 上竖线后的所有
    result3 = re.match(r"(\d{3,4})-?\d{7}|\d{8}", "0531-12345678").group()
    result4 = re.match(r"(\d{3,4})-?\d{8}|\d{7}", "0531-12345678").group()
    print(result3)
    print(result4)

    # .*表示任意内容, \num     引用分组num匹配到的字符串
    html_str = "<h1>Hello World</h1>"
    result5 = re.match(r"<(.*)>.*</\1>",html_str).group()

    # 注意 \num 引用括号的顺序
    html_str2 = "<h1><a>Hello World</a></h1>"
    result6 = re.match(r"<(.*)><(.*)>.*</\2></\1>",html_str2).group()

    # ?P<别名> --> (?P=group1)
    html_str3 = "<h1><a>Hello World</a></h1>"
    result7 = re.match(r"<(?P<group1>.*)><(.*)>.*</\2></(?P=group1)>",html_str3).group()
    print(result7)


"""
    re模块的其他函数
    1- match()      从开头匹配查找
    2- search()     不必从开头匹配查找，有就行 --> group
    3- findall()    全文查找符合正则的列表     --> list
    4- sub()        将查询到的str进行替换
    5- split()      按照正则，去切割str
"""
def testRegex02():

    html_str = """
        <div>
            <p>1991年5月，结婚12年的葛淑珍和他的一对儿女被赵本山抛弃， 1992年8月，赵本山与马丽娟结婚。他俩离婚后，12岁儿子赵铁蛋病亡。报导说，赵本山与葛淑珍离婚，其儿子赵铁蛋一命呜呼，这恐怕是赵本山这辈子感到最愧疚最后悔的一件事。</p>
            <p>1991年5月，结婚12年的葛淑珍和他的一对儿女被赵本山抛弃， 1992年8月，赵本山与马丽娟结婚。他俩离婚后，12岁儿子赵铁蛋病亡。报导说，赵本山与葛淑珍离婚，其儿子赵铁蛋一命呜呼，这恐怕是赵本山这辈子感到最愧疚最后悔的一件事。</p>
            <p>1991年5月，结婚12年的葛淑珍和他的一对儿女被赵本山抛弃， 1992年8月，赵本山与马丽娟结婚。他俩离婚后，12岁儿子赵铁蛋病亡。报导说，赵本山与葛淑珍离婚，其儿子赵铁蛋一命呜呼，这恐怕是赵本山这辈子感到最愧疚最后悔的一件事。</p>
            <p>1991年5月，结婚12年的葛淑珍和他的一对儿女被赵本山抛弃， 1992年8月，赵本山与马丽娟结婚。他俩离婚后，12岁儿子赵铁蛋病亡。报导说，赵本山与葛淑珍离婚，其儿子赵铁蛋一命呜呼，这恐怕是赵本山这辈子感到最愧疚最后悔的一件事。</p>
            <p>1991年5月，结婚12年的葛淑珍和他的一对儿女被赵本山抛弃， 1992年8月，赵本山与马丽娟结婚。他俩离婚后，12岁儿子赵铁蛋病亡。报导说，赵本山与葛淑珍离婚，其儿子赵铁蛋一命呜呼，这恐怕是赵本山这辈子感到最愧疚最后悔的一件事。</p>
            <p>1991年5月，结婚12年的葛淑珍和他的一对儿女被赵本山抛弃， 1992年8月，赵本山与马丽娟结婚。他俩离婚后，12岁儿子赵铁蛋病亡。报导说，赵本山与葛淑珍离婚，其儿子赵铁蛋一命呜呼，这恐怕是赵本山这辈子感到最愧疚最后悔的一件事。</p>
            <p>1991年5月，结婚12年的葛淑珍和他的一对儿女被赵本山抛弃， 1992年8月，赵本山与马丽娟结婚。他俩离婚后，12岁儿子赵铁蛋病亡。报导说，赵本山与葛淑珍离婚，其儿子赵铁蛋一命呜呼，这恐怕是赵本山这辈子感到最愧疚最后悔的一件事。</p>
        </div>
    """

    # 正则中的点是不能匹配**\n**的
    # 因为正则都是从左向右的，先匹配<号，还有找div>都算，知道碰到换行\n
    result = re.sub(r"<.*>","" ,html_str)
    result1 = re.sub(r"<[^>]*>","" ,html_str)
    print(result1)


"""
    Python中正则表达式的贪婪和非贪婪,这个知识点略过
"""

def testRegex03():

    str = "This is a number 234-235-22-423"
    result = re.match(r".*\d*-\d*-\d*-\d*",str).group()
    print(result)

    """
        为了防止不需要的转义，使用两个\代替一个\
        Python字符串中加r，表示原生str不再需要转义了
    """
    path_str1 = "c:\a\b\c"
    path_str2 = "c:\\a\\b\\c"
    print(path_str1)
    print(path_str2)


def main():
    testRegex01()
    print('------------------------')
    testRegex02()
    print('------------------------')
    testRegex03()


if __name__ == '__main__':
    main()
